---
title: প্রভাইডাররা
---

এখন আমরা যখন [Riverpod] ইন্সটল করে নিয়েছি, তাহলে "প্রভাইডারগুলি" কে নিয়ে কথা বলা যাক।

প্রভাইডার হচ্ছে একটি [Riverpod] অ্যাপ্লিকেশনের সবচেয়ে গুরুত্বপূর্ণ অংশ।
একটি প্রভাইডার এমন একটি বস্তু যা স্টেটের একটি অংশকে আবদ্ধ করে এবং শোনার অনুমতি দেয়
সেই স্টেটে।

## কেন ব্যবহার করবেন প্রভাইডার?

একটি স্টেট কে প্রভাইডার দিয়ে মোড়ানোর পড়, এটিঃ

- একাধিক অবস্থানে সেই স্টেট সহজেই অ্যাক্সেস করার অনুমতি দেয়।
   প্রদানকারীরা সিঙ্গলটনের মতো প্যাটার্নগুলির সম্পূর্ণ প্রতিস্থাপন,
   সার্ভিস লোকেটার, ডিপেনডেন্সি ইনজেকশন বা ইনহেরিটেড উইজেট।

- অন্য স্টেট এর সাথে এই স্টেটকে একত্রিত করা সহজ করে।
   কখনও একাধিক অবজেক্ট একত্রিত করতে সংগ্রাম করেছেন? এই দৃশ্যকল্প নির্মিত হয়
   একটি সহজ সিনট্যাক্স সহ সরাসরি প্রভাইডার এর ভিতরে।

-  পারফর্মেন্স অপ্টিমাইজেশান সক্ষম করে।
   ফিল্টারিং উইজেট পুনর্নির্মাণের (Build) জন্য হোক বা ব্যয়বহুল স্টেট কম্পিউটেশন ক্যাশ করার জন্য;
   প্রভাইডাররা নিশ্চিত করে যে শুধুমাত্র স্টেট পরিবর্তনের দ্বারা প্রভাবিত হয় শুধু তাই যেন পুনরায় বিল্ড হয়।

- অ্যাপ্লিকেশন এর টেস্ট এর সক্ষমতা বৃদ্ধি করে।
  প্রভাইডার এর সাতেহ আপনার কমপ্লেক্স `setUp`/`tearDown` এর প্রয়োজন নেই. উপরন্তু,
   যেকোন প্রভাইডারকে টেস্ট এর সময় ভিন্নভাবে আচরণ করার জন্য ওভাররাইড করা যেতে পারে, যা
   সহজেই একটি খুব নির্দিষ্ট আচরণ টেস্ট করার অনুমতি দেয়।

- উন্নত বৈশিষ্ট্যগুলির সাথে সহজ একীকরণের অনুমতি দেয়, যেমন লগিং বা
   পুল-টু-রিফ্রেশ

## প্রভাইডার তৈরি করা

প্রভাইডাররা অনেকগুলি ভেরিয়েন্টে আসে, কিন্তু তারা সব একই ভাবে কাজ করে।

সর্বাধিক সাধারণ ব্যবহার হল তাদের গ্লোবালই কন্সটেন্ট হিসাবে ঘোষণা করা::

```dart
final myProvider = Provider((ref) {
  return MyValue();
});
```

:::note
প্রভাইডার এর গ্লোবাল দিক দ্বারা ভীত হবেন না।
প্রভাইডার সম্পূর্ণরূপে অপরিবর্তনীয়. একটি প্রভাইডার ঘোষণা, একটি ফাংশন ঘোষণা থেকে ভিন্ন নয়
এবং প্রভাইডাররা টেস্টেবল এবং মেইন্টেইনেবল।
:::

এই স্নিপেট তিনটি উপাদান নিয়ে গঠিত:

- `final myProvider`, একটি ভেরিয়েবল ঘোষণা.
   এই ভেরিয়েবলটি আমরা ভবিষ্যতে আমাদের প্রভাইডারের স্টেট পড়তে ব্যবহার করব।
   এটা সবসময় অপরিবর্তনীয় (Immutable) হওয়া উচিত।

- `Provider`, এই প্রভাইডারটি আমরা ব্যবহার করার সিদ্ধান্ত নিয়েছি.
  [Provider] হচ্ছে সবচেয়ে সাধারণ প্রভাইডার.এটি এমন একটি অবজেক্ট প্রকাশ করে যা কখনই
   পরিবর্তনশীল নয়।
  আমরা [Provider] কে [StreamProvider] বা এর মত অন্যান্য প্রদানকারীর সাথে প্রতিস্থাপন করতে পারি
   [StateNotifierProvider], মানটির সাথে কীভাবে ইন্টারঅ্যাক্ট করা হয় তা পরিবর্তন করতে।

- একটি ফাংশন যা শেয়ারড স্টেট তৈরি করে।
  সেই ফাংশনটি সর্বদা একটি প্যারামিটার হিসাবে `ref` নামক একটি বস্তু গ্রহণ করবে। এই অবজেক্ট
   আমাদের অন্যান্য প্রভাইডার পড়তে বা কিছু অপারেশন সঞ্চালনের অনুমতি দেয় যখন স্টেট
   আমাদের প্রভাইডার ধ্বংস (dispose) করা হবে.

একটি প্রভাইডার এর কাছে পাঠানো ফাংশন দ্বারা তৈরি বস্তুর ধরন নির্ভর করে যে 
প্রভাইডার ব্যবহৃত হয়েছে তার উপর.
উদাহরণস্বরূপ, একটি [Provider] এর ফাংশন যেকোনো বস্তু তৈরি করতে পারে।
অন্যদিকে, [StreamProvider]-এর কলব্যাক একটি [Stream] রিটার্ন দেবে বলে আশা করা যায়।

:::info

সীমাবদ্ধতা ছাড়াই আপনি যত খুশি তত প্রভাইডার ঘোষণা করতে পারেন।
`package:provider` ব্যবহার করার বিপরীতে, [Riverpod]-এ আমাদের দুটি প্রভাইডার থাকতে পারে যা
একই "টাইপ" এর একটি স্টেট প্রকাশ করেঃ

```dart
final cityProvider = Provider((ref) => 'London');
final countryProvider = Provider((ref) => 'England');
```

উভয় প্রভাইডার একটি `String` তৈরি করে যা কোনো সমস্যা সৃষ্টি করে না।
:::

:::caution
For providers to work, you must add [ProviderScope] at the root of your
Flutter applications:

প্রভাইডার গুলো কাজ করার জন্য, আপনাকে অবশ্যই আপনার ফ্লটার অ্যাপ্লিকেশন রুটে [ProviderScope] যোগ করতে হবেঃ


```dart
void main() {
  runApp(ProviderScope(child: MyApp()));
}
```

:::

## স্টেট ধ্বংসের আগে কাজ সম্পাদন করা


কিছু ক্ষেত্রে, প্রভাইডারের স্টেট ধ্বংস বা পুনরায় তৈরি হতে পারে।
এই পরিস্থিতিতে একটি সাধারণ ব্যবহারের ক্ষেত্র হচ্ছে একটি প্রভাইডারের স্টেট ধ্বংস হওয়ার আগে একটি এটি পরিষ্কার করা হয়, অথবা ডিসপোস করা, যেমন একটি `StreamController` বন্ধ করা।

এটি `ref` অবজেক্ট ব্যবহার করে করা হয়, যা তার [onDispose] মেথড বা পদ্ধতি ব্যবহার করে সমস্ত প্রভাইডারের কলব্যাকে পাঠানো হয়।

নিচের উদাহরণটি [onDispose] ব্যবহার করে একটি `StreamController` বন্ধ (Dispose) করার জন্য:

```dart
final example = StreamProvider.autoDispose((ref) {
  final streamController = StreamController<int>();

  ref.onDispose(() {
    // StreamController বন্ধ করে দেয় যখন প্রভাইডার এর স্টেট ধ্বংস হয়ে যায়।
    streamController.close();
  });

  return streamController.stream;
});
```

:::note
প্রভাইডার এর উপর নির্ভর করে অনেক সময় এটি নিজে নিজে ক্লিনআপ বা পরিষ্কার করে নিতে পারে,
উদাহারণসরূপ, [StateNotifierProvider] কল করবে `dispose` যা `StateNotifier` এর একটি মেথড.
:::

## প্রভাইডার সংশোধক (মডিফায়ার)

আপনার বিভিন্ন প্রভাইডারে অতিরিক্ত কার্যকারিতা যোগ করার জন্য সমস্ত প্রভাইডারের মধ্যে একটি অন্তর্নির্মিত উপায় রয়েছে।

তারা `ref` অবজেক্টে নতুন বৈশিষ্ট্য যোগ করতে পারে বা প্রভাইডারের পদ্ধতিতে কিছুটা পরিবর্তন করতে পারে যে
কিভাবে তা কনসীউম করা হবে।

নামযুক্ত কনস্ট্রাক্টরের অনুরূপ একটি সিনট্যাক্স সহ সমস্ত প্রভাইডারে সংশোধক ব্যবহার করা যেতে পারেঃ

```dart
final myAutoDisposeProvider = StateProvider.autoDispose<int>((ref) => 0);
final myFamilyProvider = Provider.family<String, int>((ref, id) => '$id');
```

এই মুহুর্তে, দুটি সংশোধক এভেইলেবেল রয়েছেঃ

- [`.autoDispose`](./modifiers/auto_dispose), যা প্রভাইডারকে স্বয়ংক্রিয়ভাবে তার স্টেট ধ্বংস করে দেবে
   যখন এটি আর রিড করা হচ্ছে না।
- [`.family`](./modifiers/family), যা বাহ্যিক প্যারমিটার থেকে একটি প্রভাইডার তৈরি করার অনুমতি দেয়.

:::note
একজন প্রভাইডার একসাথে একাধিক সংশোধক ব্যবহার করতে পারেঃ

```dart
final userProvider = FutureProvider.autoDispose.family<User, int>((ref, userId) async {
  return fetchUser(userId);
});
```

:::

তাহলে এই গাইডটি এই পর্যন্তই!

আপনি আর জানতে পারেন [কিভাবে একটি প্রভাইডার পড়তে হয়](../concepts/reading).
অথবা, আপনি দেখতে পারেন [কিভাবে প্রভাইডার একত্র করবেন](../concepts/combining_providers).

[get_it]: http://pub.dev/packages/get_it
[inheritedwidget]: https://api.flutter.dev/flutter/widgets/InheritedWidget-class.html
[stream]: https://api.dart.dev/stable/2.8.4/dart-async/Stream-class.html
[ondispose]: https://pub.dev/documentation/riverpod/latest/riverpod/Ref/onDispose.html
[riverpod]: https://github.com/rrousselgit/riverpod
[hooks_riverpod]: https://pub.dev/packages/hooks_riverpod
[flutter_riverpod]: https://pub.dev/packages/flutter_riverpod
[flutter_hooks]: https://github.com/rrousselGit/flutter_hooks
[provider]: ../providers/provider
[streamprovider]: ../providers/stream_provider
[statenotifierprovider]: ../providers/state_notifier_provider
[providerscope]: https://pub.dev/documentation/flutter_riverpod/latest/flutter_riverpod/ProviderScope-class.html
